/*
 *  linux/kernel/mktime.c
 *
 *  (C) 1991  Linus Torvalds
 */

#include <time.h>   // 时间头文件，定义了标准时间数据结构 tm 和一些处理时间函数原型。
// 这里不是库函数，它仅供内核使用。因此我们不关系小于1970年的年份等，但假定一些均很正常。通用时间区域TZ问题也先忽略。我们只是尽可能简单的处理问题
/*  // 最好能找到一些公开的库函数（尽管我任务MINIX的时间函数是公开的）
 * This isn't the library routine, it is only used in the kernel.
 * as such, we don't care about years<1970 etc, but assume everything
 * is ok. Similarly, TZ etc is happily ignored. We just do everything
 * as easily as possible. Let's find something public for the library
 * routines (although I think minix times is public).
 */
/* // 另外 我恨哪个设置1970年开始的人0 难道他们就不能选择从一个闰年开始？
 * PS. I hate whoever though up the year 1970 - couldn't they have gotten
 * a leap-year instead? I also hate Gregorius, pope or no. I'm grumpy.
 */
#define MINUTE 60
#define HOUR (60*MINUTE)
#define DAY (24*HOUR)
#define YEAR (365*DAY)
// 有趣的是我们考虑进了闰年
/* interestingly, we assume leap-years */
static int month[12] = {        // 下面以年为界限，定义了每个月开始时的秒数时间数组
	0,
	DAY*(31),
	DAY*(31+29),
	DAY*(31+29+31),
	DAY*(31+29+31+30),
	DAY*(31+29+31+30+31),
	DAY*(31+29+31+30+31+30),
	DAY*(31+29+31+30+31+30+31),
	DAY*(31+29+31+30+31+30+31+31),
	DAY*(31+29+31+30+31+30+31+31+30),
	DAY*(31+29+31+30+31+30+31+31+30+31),
	DAY*(31+29+31+30+31+30+31+31+30+31+30)
};
// 该函数计算从1970年1月1日0时起到开机当日经过的秒数，作为开机时间
long kernel_mktime(struct tm * tm)
{
	long res;
	int year;

	year = tm->tm_year - 70;    // 从1970年到现在经过的年数 会有千年虫问题
/* magic offsets (y+1) needed to get leapyears right.*/
	res = YEAR*year + DAY*((year+1)/4); // 为了获取正确的闰年数，这里需要这样一个魔幻值 这些年经过的秒数时间+每个闰年时多1天
	res += month[tm->tm_mon];           // 的秒数时间，在加上当年到当月时的秒数
/* and (y+2) here. If it wasn't a leap-year, we have to adjust */
	if (tm->tm_mon>1 && ((year+2)%4))   // 以及（y+2） 如果（y+2）不是闰年，那么我们就必须进行调整
		res -= DAY;
	res += DAY*(tm->tm_mday-1);         // 再加上本月过去的天数的秒数时间
	res += HOUR*tm->tm_hour;            // 再加上当天过去的小时数的秒数时间
	res += MINUTE*tm->tm_min;           // 再加上1小时内过去的分钟数的秒数时间
	res += tm->tm_sec;                  // 再加上1分钟内的秒数
	return res;                         // 就直接得出1970年以来经过的秒数时间
}   // 闰年计算方法：如果y能被4整除且不能被100整除，或者能被400整除 则y是闰年
